package top.jiangqiang.crawler.core.http.entities.body;

import org.jetbrains.annotations.NotNull;
import top.jiangqiang.crawler.core.exception.CrawlerException;

import java.io.Serializable;
import java.nio.charset.Charset;
import java.util.Map;

public interface HttpBody<T> extends Serializable {
    /**
     * 获取内部存储的数据
     *
     * @return
     */
    @NotNull
    default Map<String, T> getData() {
        throw new CrawlerException("不支持此操作");
    }

    @SuppressWarnings("unchecked")
    default void merge(HttpBody<?> body) {
        //当前实例对应的类是指定参数实例对应类的父类或接口或者是同一个类
        if (this.getClass().isAssignableFrom(body.getClass())) {
            Map<String, T> data = getData();
            data.putAll(((HttpBody<T>) body).getData());
        }
    }

    /**
     * @return 获取字符串类型body
     */
    default String getBodyStr() {
        throw new CrawlerException("不支持此操作");
    }

    /**
     * 获取Content-Type
     *
     * @return Content-Type值
     */
    String getContentType();

    /**
     * 获取指定编码的Content-Type，类似于：application/json;charset=UTF-8
     *
     * @param charset 编码
     * @return Content-Type
     */
    default String getContentType(final Charset charset) {
        final String contentType = getContentType();
        if (null == contentType) {
            return null;
        }
        return contentType + ";charset=" + charset.name().toLowerCase();
    }

}
